package org.jaaksi.kottlindemo.cls

/**
 * 初始化顺序：字段初始化赋初值 > init > 次构造函数
 *
 * <p>如果类有一个主构造函数，每个次构造函数需要委托给主构造函数，
 * 可以直接委托或者通过别的次构造函数间接委托。
 * 委托到同一个类的另一个构造函数用 this 关键字即可：</p>
 *
 * <p>如果派生类有一个主构造函数，其基类可以（并且必须） 用派生类主构造函数的参数就地初始化</p>
 *
 */
class ChildClas(name: String, var age: Int) : ParentClas(name) {
  var id: String? = null

  constructor(name: String, age: Int, id: String?) : this(name, age) {
    this.id = id
  }

  // 标记为 override 的成员本身是开放的，也就是说，它可以在子类中覆盖。如果你想禁止再次覆盖，使用 final 关键字
  final override fun say() {
    // 如果有多个父类有相同的抽象方法需要实现，则用super<父类>.调用父类方法
    super<ParentClas>.say()
    println(id)
  }
}